package action;

import ejb.AdministrarHistoriaBean;
import entidades.TActEconomica;
import entidades.TAntecedente;
import entidades.TCiudad;
import entidades.TDepartamento;
import entidades.TEmpresaSalud;
import entidades.TEstadoCivil;
import entidades.TGenero;
import entidades.TParentesco;
import entidades.TPatologia;
import entidades.TPersona;
import entidades.TProfesional;
import entidades.TTipDocumento;
import enumeraciones.TipoAntecedenteEnum;
import enumeraciones.TipoPatologiaEnum;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import org.primefaces.context.RequestContext;
import org.primefaces.event.CaptureEvent;
import org.primefaces.event.RowEditEvent;
import utils.DateUtils;
import utils.MensajeUtils;

@ManagedBean(name = "administrarHistoriasClinicasAction")
@SessionScoped
public class AdministrarHistoriasClinicasAction implements Serializable {

    @EJB
    AdministrarHistoriaBean administrarHistoriasClinicasBean;

    private final String INFORMACION = MensajeUtils.getMensaje("informacion");

    private boolean mostrarModal;
    private boolean mostrarPanel;

    private boolean isCrear;

    private String tituloPersona;
    private String tituloboton;

    private String operacionExitosa;

    TPersona persona = new TPersona();
    TPersona personaCrear = new TPersona();
    TPersona personaSelected = new TPersona();
    List<TPersona> listaPersonas;
    List<TTipDocumento> listaTipoDocumentos;
    List<TGenero> listaGeneros;
    List<TEstadoCivil> listaEstadoCivil;
    List<TEmpresaSalud> listaEPS;
    List<TActEconomica> listaOcupacion;

    List<TAntecedente> listaAntecedentes;
    List<TAntecedente> listaAntecedentesConsultar;

    List<TipoAntecedenteEnum> listaTipoAntecedentes;
    List<TParentesco> listaParentescos;

    List<TPatologia> listaPatologiasAll;
    List<TPatologia> listaPatologias;

    TDepartamento departamentoMostrar;
    List<TCiudad> listaCiudades;
    List<TCiudad> listaCiudadesMostrar;
    List<TDepartamento> listaDepartamentos;

    /*@ManagedProperty(value="#{administrarLoginAction}" )
     AdministrarLoginAction administrarLoginAction;*/
    @PostConstruct
    public void init() {

        listaTipoDocumentos = administrarHistoriasClinicasBean.consultarTiposDocumento();
        listaGeneros = administrarHistoriasClinicasBean.consultarGeneros();
        listaEstadoCivil = administrarHistoriasClinicasBean.consultarEstadosCiviles();
        listaEPS = administrarHistoriasClinicasBean.consultarEPS();
        listaOcupacion = administrarHistoriasClinicasBean.consultarOcupaciones();
        listaParentescos = administrarHistoriasClinicasBean.consultarParentescos();

        listaTipoAntecedentes = Arrays.asList(TipoAntecedenteEnum.values());
        listaDepartamentos = administrarHistoriasClinicasBean.consultarDepartamentos();
        listaCiudades = administrarHistoriasClinicasBean.consultarCiudades();
        listaCiudadesMostrar = new ArrayList<TCiudad>();
    }

    public void oncapture(CaptureEvent captureEvent) {
        personaCrear.setFoto("data:image/png;base64," + captureEvent.getRawData());
    }

    public void onEdit(RowEditEvent event) {
        FacesMessage msg = new FacesMessage(MensajeUtils.getMensaje("antecedenteEditado"), "");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void actualizarPatologias(TipoPatologiaEnum tipoPatologiaEnum) {
        listaPatologias = new ArrayList<TPatologia>();
        if (tipoPatologiaEnum != null) {
            for (TPatologia aux : listaPatologiasAll) {
                if (aux.getTipoPatologia() == tipoPatologiaEnum) {
                    listaPatologias.add(aux);
                }
            }
        }
    }

    public String crearPersona() {
        personaCrear = new TPersona();

        listaAntecedentes = new ArrayList<TAntecedente>();
        listaPatologiasAll = administrarHistoriasClinicasBean.consultarPatologias();
        listaPatologias = new ArrayList<TPatologia>();

        tituloPersona = MensajeUtils.getMensaje("tituloPersonaCrear");
        tituloboton = MensajeUtils.getMensaje("crear");

        operacionExitosa = MensajeUtils.getMensaje("creacionExitosa");
        departamentoMostrar = null;
        isCrear = true;
        mostrarModal = false;
        mostrarPanel = false;

        return "crear_persona?faces-redirect=true";
    }

    public String modificar(TPersona personaSelected) {
        this.personaCrear = personaSelected;
        this.personaCrear.setEdad(DateUtils.calcularEdad(personaCrear.getFecNacimiento()));
        listaAntecedentes = administrarHistoriasClinicasBean.consultarAntecedentesPersona(personaSelected);
        listaPatologiasAll = administrarHistoriasClinicasBean.consultarPatologias();
        listaPatologias = new ArrayList<TPatologia>();

        tituloPersona = MensajeUtils.getMensaje("tituloPersonaModificar");
        tituloboton = MensajeUtils.getMensaje("modificar");

        operacionExitosa = MensajeUtils.getMensaje("modificacionExitosa");
        if (personaCrear.gettCiudad() != null) {
            departamentoMostrar = personaCrear.gettCiudad().getTDepartamento();
            cambiarListaCiudades();
        }
        isCrear = false;

        mostrarModal = false;
        mostrarPanel = false;

        return "crear_persona?faces-redirect=true";
    }

    public void buscar() {

        listaPersonas = administrarHistoriasClinicasBean.buscarPersona(persona);
        if (listaPersonas == null || listaPersonas.isEmpty()) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, INFORMACION, MensajeUtils.getMensaje("personaNoexiste")));
        }
    }

    public String consultarDetalle(TPersona personaSelected) {
        this.personaSelected = personaSelected;
        this.personaSelected.setEdad(DateUtils.calcularEdad(personaSelected.getFecNacimiento()));
        listaAntecedentesConsultar = administrarHistoriasClinicasBean.consultarAntecedentesPersona(personaSelected);
        return "consultar_persona_detalle";
    }

    public void eliminar(TPersona personaSelected) {
        administrarHistoriasClinicasBean.eliminarPersona(personaSelected);
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, INFORMACION, MensajeUtils.getMensaje("personaEliminadaExito")));
        buscar();
    }

    public void crear() {
        /*if (!validarDiagnosticos()) {
         return;
         }*/
        mostrarModal = false;
        try {
            //quitar
            TProfesional user = new TProfesional();
            user.setUserName("javier.rey");
            //administrarHistoriasClinicasBean.crearPersona(personaCrear,administrarLoginAction.getUser());
            operacionExitosa = MensajeUtils.getMensaje("creacionExitosa");
            administrarHistoriasClinicasBean.crearPersona(personaCrear, user);
            /*administrarHistoriasClinicasBean.crearAntecedentes(listaAntecedentes,administrarLoginAction.getUser());*/
            mostrarModal = true;
            mostrarPanel = true;
            //buscar();
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, INFORMACION + " " + ex.getMessage(), ""));
        }

    }

    public void validarConcurrenciaPersona(TPersona per) {
        if (per != null) {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN, MensajeUtils.getMensaje("advertencia"), MensajeUtils.getMensaje("concurrencyPersona"));
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public String cancelar() {
        buscar();
        RequestContext.getCurrentInstance().update(":formConsulta");
        return "gestionar_personas?faces-redirect=true";
    }

    public void adicionarAntecedente() {

        if (!validarDiagnosticos()) {
            return;
        }

        TAntecedente antecedente = new TAntecedente();
        antecedente.setTPersona(personaCrear);
        listaAntecedentes.add(antecedente);
    }

    private boolean validarDiagnosticos() {
        if (listaAntecedentes.size() > 0) {
            for (TAntecedente antecedenteAux : listaAntecedentes) {
                if (antecedenteAux.getTipoAntecedente() == null) {
                    FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN, INFORMACION + " " + MensajeUtils.getMensaje("imposibleAdicionarAntecedente"), "");
                    FacesContext.getCurrentInstance().addMessage(null, msg);
                    return false;
                }
            }
        }
        return true;
    }

    public void sumprimirAntecedente(TAntecedente antecedenteSelected) {
        listaAntecedentes.remove(antecedenteSelected);
    }

    public void calcularEdad() {
        personaCrear.setEdad(personaCrear.calcularEdad());
        if (personaCrear.getEdadMostrar() != null && personaCrear.getEdadMostrar() > 18) {
            personaCrear.setDesResponsable(null);
            personaCrear.setDesAcompanante(null);
        }
    }

    public String resolverOperacion() {
        if (mostrarModal) {
            return "gestionar_personas?faces-redirect=true";
        }
        return "";
    }

    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {

        System.out.println(value);
    }

    public void resolverMensaje() {
        if (mostrarModal) {
            if (isCrear) {
                operacionExitosa = MensajeUtils.getMensaje("creacionExitosa");
            } else {
                operacionExitosa = MensajeUtils.getMensaje("modificacionExitosa");
            }
        } else {
            operacionExitosa = MensajeUtils.getMensaje("erroresPagina");
        }
    }

    public void cambiarListaCiudades() {
        listaCiudadesMostrar = new ArrayList<TCiudad>();
        if (departamentoMostrar == null) {
            return;
        }

        for (TCiudad ciudad : listaCiudades) {
            if (ciudad.getTDepartamento().getIdDepartamento().equals(departamentoMostrar.getIdDepartamento())) {
                listaCiudadesMostrar.add(ciudad);
            }
        }

    }

    public TPersona getPersona() {
        return persona;
    }

    public void setPersona(TPersona persona) {
        this.persona = persona;
    }

    public List<TPersona> getListaPersonas() {
        return listaPersonas;
    }

    public void setListaPersonas(List<TPersona> listaPersonas) {
        this.listaPersonas = listaPersonas;
    }

    public TPersona getPersonaSelected() {
        return personaSelected;
    }

    public void setPersonaSelected(TPersona personaSelected) {
        this.personaSelected = personaSelected;
    }

    public TPersona getPersonaCrear() {
        return personaCrear;
    }

    public void setPersonaCrear(TPersona personaCrear) {
        this.personaCrear = personaCrear;
    }

    public List<TTipDocumento> getListaTipoDocumentos() {
        return listaTipoDocumentos;
    }

    public void setListaTipoDocumentos(List<TTipDocumento> listaTipoDocumentos) {
        this.listaTipoDocumentos = listaTipoDocumentos;
    }

    public List<TGenero> getListaGeneros() {
        return listaGeneros;
    }

    public void setListaGeneros(List<TGenero> listaGeneros) {
        this.listaGeneros = listaGeneros;
    }

    public List<TEstadoCivil> getListaEstadoCivil() {
        return listaEstadoCivil;
    }

    public void setListaEstadoCivil(List<TEstadoCivil> listaEstadoCivil) {
        this.listaEstadoCivil = listaEstadoCivil;
    }

    public List<TEmpresaSalud> getListaEPS() {
        return listaEPS;
    }

    public void setListaEPS(List<TEmpresaSalud> listaEPS) {
        this.listaEPS = listaEPS;
    }

    public List<TActEconomica> getListaOcupacion() {
        return listaOcupacion;
    }

    public void setListaOcupacion(List<TActEconomica> listaOcupacion) {
        this.listaOcupacion = listaOcupacion;
    }

    public String getTituloPersona() {
        return tituloPersona;
    }

    public void setTituloPersona(String tituloPersona) {
        this.tituloPersona = tituloPersona;
    }

    public String getTituloboton() {
        return tituloboton;
    }

    public void setTituloboton(String tituloboton) {
        this.tituloboton = tituloboton;
    }

    public List<TipoAntecedenteEnum> getListaTipoAntecedentes() {
        return listaTipoAntecedentes;
    }

    public void setListaTipoAntecedentes(
            List<TipoAntecedenteEnum> listaTipoAntecedentes) {
        this.listaTipoAntecedentes = listaTipoAntecedentes;
    }

    public List<TAntecedente> getListaAntecedentes() {
        return listaAntecedentes;
    }

    public void setListaAntecedentes(List<TAntecedente> listaAntecedentes) {
        this.listaAntecedentes = listaAntecedentes;
    }

    public List<TPatologia> getListaPatologias() {
        return listaPatologias;
    }

    public void setListaPatologias(List<TPatologia> listaPatologias) {
        this.listaPatologias = listaPatologias;
    }

    public List<TParentesco> getListaParentescos() {
        return listaParentescos;
    }

    public void setListaParentescos(List<TParentesco> listaParentescos) {
        this.listaParentescos = listaParentescos;
    }

    public List<TAntecedente> getListaAntecedentesConsultar() {
        return listaAntecedentesConsultar;
    }

    public void setListaAntecedentesConsultar(
            List<TAntecedente> listaAntecedentesConsultar) {
        this.listaAntecedentesConsultar = listaAntecedentesConsultar;
    }

    public boolean getMostrarModal() {
        return mostrarModal;
    }

    public void setMostrarModal(boolean mostrarModal) {
        this.mostrarModal = mostrarModal;
    }

    public String getOperacionExitosa() {
        return operacionExitosa;
    }

    public void setOperacionExitosa(String operacionExitosa) {
        this.operacionExitosa = operacionExitosa;
    }

    public boolean isMostrarPanel() {
        return mostrarPanel;
    }

    public void setMostrarPanel(boolean mostrarPanel) {
        this.mostrarPanel = mostrarPanel;
    }

    public TDepartamento getDepartamentoMostrar() {
        return departamentoMostrar;
    }

    public void setDepartamentoMostrar(TDepartamento departamentoMostrar) {
        this.departamentoMostrar = departamentoMostrar;
    }

    public List<TCiudad> getListaCiudades() {
        return listaCiudades;
    }

    public void setListaCiudades(List<TCiudad> listaCiudades) {
        this.listaCiudades = listaCiudades;
    }

    public List<TDepartamento> getListaDepartamentos() {
        return listaDepartamentos;
    }

    public void setListaDepartamentos(List<TDepartamento> listaDepartamentos) {
        this.listaDepartamentos = listaDepartamentos;
    }

    public List<TCiudad> getListaCiudadesMostrar() {
        return listaCiudadesMostrar;
    }

    public void setListaCiudadesMostrar(List<TCiudad> listaCiudadesMostrar) {
        this.listaCiudadesMostrar = listaCiudadesMostrar;
    }


    /*public AdministrarLoginAction getAdministrarLoginAction() {
     return administrarLoginAction;
     }*/
    /*public void setAdministrarLoginAction(
     AdministrarLoginAction administrarLoginAction) {
     this.administrarLoginAction = administrarLoginAction;
     }*/
}
